﻿// ----------------------------------------------------------------------------------------
// Author:                    Magaly Vargas y Joaquín López
// Company:                   ALBALIA INTERACTIVA S.L.
// Assembly version:          1.0.0.0
// Date:                      22/02/2010
// Time:                      12:00
// Solution Name:             OffInvoiceWordAddIn
// Solution Filename:         OffInvoiceWordAddIn
// Solution FullFilename:     C:\Desarrollo\OffInvoiceWordAddIn
// Project Name:              OffInvoiceWordAddIn
// Project Filename:          OffInvoiceWordAddIn.csproj
// Project FullFilename:      C:\Desarrollo\OffInvoiceWordAddIn\OffInvoiceWordAddIn.csproj
// Project Item Name:         ExportController.cs
// Project Item Filename:     ExportController.cs
// Project Item FullFilename: C:\Desarrollo\OffInvoiceWordAddIn\ExportController.cs
// Project Item Kind:         Código
// Purpose:                   
//Copyright © 2009 - 2010 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Office = Microsoft.Office.Core;
using OffInvoiceWordAddIn.FacturaeFiles;
using System.Xml;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.Globalization;
using OffInvoiceWordAddIn.UBLFiles;
using Microsoft.Office.Interop.Word;

namespace OffInvoiceWordAddIn
{

    /// <summary>
    /// Clase que define el proceso de exportación de una factura
    /// </summary>
    class ExportController
    {
        #region "Fields"

        /// <summary>
        /// Campo con la cultura para el formato de los numeros, fechas y moneda
        /// </summary>
        CultureInfo cInfo = null;

        /// <summary>
        /// Campo con la definición de los formatos de los numero
        /// </summary>
        FieldFormats ff = null;

        /// <summary>
        /// Campo con los calculos para la generación de la factura
        /// </summary>
        Calculos calculos = null;


        #endregion

        #region "Constructor"

        /// <summary>
        /// Constructor
        /// </summary>
        public ExportController()
        {
            cInfo = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            ff = new FieldFormats(cInfo, cInfo.NumberFormat, cInfo.Name);
            calculos = new Calculos(ff);
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método que exporta una factura en papel
        /// </summary>
        /// <param name="path">Path donde se encuentra el xslx con la factura</param>
        /// <param name="notify">Notificación</param>
        /// <returns>La factura en papel</returns>
        public Facturae exportPaperInvoice(string path, bool notify)
        {
            try
            {
                FacturaeFieldAndValues datos = new FacturaeFieldAndValues();
                foreach (Microsoft.Office.Interop.Word.ContentControl item in Globals.ThisAddIn.Application.ActiveDocument.ContentControls)
                {
                    if (!string.IsNullOrEmpty(item.Tag) && !string.IsNullOrEmpty(item.Range.Text))
                    {
                        string value = item.Range.Text.Trim();
                        if (item.Tag.Equals("TH_PersonTypeCode")
                            || item.Tag.Equals("TH_ResidenceTypeCode")
                            || item.Tag.Equals("TH_CountryCode")
                            || item.Tag.Equals("SP_PersonTypeCode")
                            || item.Tag.Equals("SP_ResidenceTypeCode")
                            || item.Tag.Equals("SP_CountryCode")
                            || item.Tag.Equals("BP_PersonTypeCode")
                            || item.Tag.Equals("BP_ResidenceTypeCode")
                            || item.Tag.Equals("BP_CountryCode")
                            || item.Tag.Equals("IH_InvoiceDocumentType")
                            || item.Tag.Equals("IH_InvoiceClass")
                            //|| item.Tag.Equals("CORR_ReasonCode")
                            || item.Tag.Equals("CORR_ReasonDescription")
                            //|| item.Tag.Equals("CORR_CorrectionMethod")
                            || item.Tag.Equals("CORR_CorrectionMethodDescription")
                            || item.Tag.Equals("InvoiceIssuerType"))
                        {
                            /*si lo encontramos buscamos el valor correspondiente al texto seleccionado*/
                            foreach (ContentControlListEntry entry in item.DropdownListEntries)
                            {
                                if (!string.IsNullOrEmpty(item.Tag))
                                {
                                    if (entry.Text.ToLower().Equals(value.ToLower()))
                                    {
                                        if (item.Tag.Equals("CORR_ReasonDescription"))
                                        {
                                            datos.setFieldAndValue("CORR_ReasonDescription_Value", entry.Value);
                                            break;
                                        }
                                        else if (item.Tag.Equals("CORR_CorrectionMethodDescription"))
                                        {
                                            datos.setFieldAndValue("CORR_CorrectionMethodDescription_Value", entry.Value);
                                            break;
                                        }
                                        else
                                        {
                                            value = entry.Value; break;
                                        }
                                    }
                                }

                            }
                        }
                        datos.setFieldAndValue(item.Tag, value);
                    }
                }


                FacturaeGenerator generador = new FacturaeGenerator(new Facturae(), Globals.ThisAddIn.Application.ActiveDocument, true, InvoceTypes.FACTURAE_3_1, calculos, datos);
                Facturae paperInvoice = generador.getFacturae();

                XmlRootAttribute rootAttribute = new XmlRootAttribute();
                rootAttribute.Namespace = "http://www.facturae.es/Facturae/2007/v3.1/Facturae";
                rootAttribute.IsNullable = false;

                XmlSerializer serializer = new XmlSerializer(typeof(Facturae), rootAttribute);
                System.IO.StreamWriter w = new System.IO.StreamWriter(path);

                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("namespace", "http://www.facturae.es/Facturae/2007/v3.0/Facturae");
                ns.Add("", "http://www.facturae.es/Facturae/2007/v3.1/Facturae");
                ns.Add("namespace2", "http://uri.etsi.org/01903/v1.3.2#");
                ns.Add("namespace3", "http://www.w3.org/2000/09/xmldsig#");

                serializer.Serialize(w, paperInvoice, ns);
                w.Close();

                if (notify)
                {
                    ControlMessages controlM = ControlMessages.getInstance();
                    MessageBox.Show(controlM.getMessage(ControlMessages.Msg.InfoExportedInvoice), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
                return paperInvoice;
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Método que extrae una facturae de un xlsx.
        /// </summary>
        /// <param name="path">Path donde se encuentra la factura</param>
        /// <param name="notify">Notificacion</param>
        public void extraerfacturae(string path, bool notify)
        {

            if (!string.IsNullOrEmpty(path))
            {
                Office.CustomXMLPart customPartReceived;
                try
                {
                    string customPartID = Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId);



                    customPartReceived = Globals.ThisAddIn.Application.ActiveDocument.CustomXMLParts.SelectByID(customPartID);

                    if (customPartReceived != null)
                    {
                        XmlDocument doc = new XmlDocument();
                        doc.PreserveWhitespace = true;
                        doc.LoadXml(customPartReceived.DocumentElement.XML);
                        doc.Save(path);

                        if (notify)
                        {
                            ControlMessages controlM = ControlMessages.getInstance();
                            MessageBox.Show(controlM.getMessage(ControlMessages.Msg.InfoExportedInvoice), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                        }

                    }
                    else
                    {
                        throw new Exception();
                    }
                }

                catch (Exception e) { throw e; }
            }
        }

        #endregion
    }
}
